if ( (rc = elf_xen_parse(elf, &dom->parms)) != 0 )
return rc;
+ if ( elf_xen_feature_get(XENFEAT_privileged, dom->parms.f_required) ||
+ (elf_xen_feature_get(XENFEAT_privileged, dom->parms.f_supported) &&
+ !elf_xen_feature_get(XENFEAT_unprivileged, dom->parms.f_supported)) )
+ {
+ xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: Kernel does not"
+ " support unprivileged (DomU) operation", __FUNCTION__);
+ return -EINVAL;
+ }
+
/* find kernel segment */
dom->kernel_seg.vstart = dom->parms.virt_kstart;
dom->kernel_seg.vend = dom->parms.virt_kend;
return -1;
}
+ if (test_bit(XENFEAT_unprivileged, parms.f_required) ||
+ (test_bit(XENFEAT_unprivileged, parms.f_supported) &&
+ !test_bit(XENFEAT_privileged, parms.f_supported)))
+ {
+ printk("Kernel does not support Dom0 operation\n");
+ return -1;
+ }
+
p_start = parms.virt_base;
pkern_start = parms.virt_kstart;
pkern_end = parms.virt_kend;
return -EINVAL;
}
+ if ( test_bit(XENFEAT_unprivileged, parms.f_required) ||
+ (test_bit(XENFEAT_unprivileged, parms.f_supported) &&
+ !test_bit(XENFEAT_privileged, parms.f_supported)) )
+ {
+ printk("Kernel does not support Dom0 operation\n");
+ return -EINVAL;
+ }
+
#if defined(__x86_64__)
if ( compat32 )
{
switch ( fi.submap_idx )
{
case 0:
- fi.submap = 0;
+ fi.submap = 1U << (IS_PRIV(current->domain) ?
+ XENFEAT_privileged : XENFEAT_unprivileged);
if ( VM_ASSIST(d, VMASST_TYPE_pae_extended_cr3) )
fi.submap |= (1U << XENFEAT_pae_pgdir_above_4gb);
if ( paging_mode_translate(current->domain) )
[XENFEAT_writable_descriptor_tables] = "writable_descriptor_tables",
[XENFEAT_auto_translated_physmap] = "auto_translated_physmap",
[XENFEAT_supervisor_mode_kernel] = "supervisor_mode_kernel",
- [XENFEAT_pae_pgdir_above_4gb] = "pae_pgdir_above_4gb"
+ [XENFEAT_pae_pgdir_above_4gb] = "pae_pgdir_above_4gb",
+ [XENFEAT_privileged] = "privileged",
+ [XENFEAT_unprivileged] = "unprivileged"
};
static const int elf_xen_features =
sizeof(elf_xen_feature_names) / sizeof(elf_xen_feature_names[0]);
#define XENFEAT_hvm_safe_pvclock 9
/* x86: pirq can be used by HVM guests */
-#define XENFEAT_hvm_pirqs 10
+#define XENFEAT_hvm_pirqs 10
+
+/* privileged operation is supported */
+#define XENFEAT_privileged 11
+
+/* un-privileged operation is supported */
+#define XENFEAT_unprivileged 12
#define XENFEAT_NR_SUBMAPS 1